Skip to main content

🧠 C Programlamada fgets() ve gets() Fonksiyonları

Bu rehberde, C programlama dilinde boşluk içeren metinleri (string) doğru şekilde almayı öğreneceksiniz.
scanf() fonksiyonunun kısıtlamalarını, gets() fonksiyonunun neden artık önerilmediğini
ve modern C programlamada güvenli seçenek olan fgets() fonksiyonunun nasıl kullanıldığını göreceksiniz.


🎯 Bu Rehberde Ne Öğreneceksiniz

  • scanf() ile boşluklu metin okuma problemini anlamak
  • gets() fonksiyonunun sözdizimini ve risklerini öğrenmek
  • fgets() ile güvenli veri almayı uygulamak
  • Dosyadan ve standart girdiden (stdin) okuma örnekleri
  • gets() vs fgets() güvenlik karşılaştırması

1️⃣ scanf() Fonksiyonunun Sınırlamaları

C’de scanf() genellikle basit girdiler için kullanılır, ancak boşluk içeren string okumada başarısız olur.
Boşluk veya yeni satır (\n) gördüğünde okumayı durdurur.

#include<stdio.h>

int main() {
char string[10];
printf("Metni girin: ");
scanf("%s", string); // Boşluktan sonrasını okumaz
printf("\nOkunan metin: %s", string);
return 0;
}

📤 Çıktı:


Metni girin: Merhaba Dünya
Okunan metin: Merhaba

💡 Gördüğünüz gibi, scanf() yalnızca ilk kelimeyi okur. Boşlukları da dahil etmek için gets() veya fgets() kullanılır.


2️⃣ gets() Fonksiyonu

gets() fonksiyonu, kullanıcıdan bir satır metin okumak için kullanılır. Yeni satır (\n) karakterine ulaşana kadar okumayı sürdürür.

Sözdizimi:


gets(degisken_adi);

Örnek:


#include<stdio.h>

int main() {
char string[10];
printf("Metni girin: ");
gets(string); // Tüm satırı okur
printf("\nOkunan metin: %s", string);
return 0;
}

📤 Örnek çıktı:


Metni girin: Merhaba Dünya
Okunan metin: Merhaba Dünya

⚠️ Uyarı: gets() artık modern C standardında kaldırılmıştır. Kullanıcının belirttiği tampon (buffer) boyutunu aşması durumunda bellek taşması (buffer overflow) oluşur. Bu, programın çökmesine veya güvenlik açığına yol açabilir.


3️⃣ fgets() Fonksiyonu (Güvenli Yöntem)

fgets() fonksiyonu, gets()'in güvenli alternatifidir. Hem dosyadan hem de klavyeden veri okumak için kullanılabilir. Veri uzunluğu belirtilir, böylece bellek taşması engellenir.

Sözdizimi:


fgets(char *str, int n, FILE *stream);
ParametreAçıklama
strVerinin kaydedileceği karakter dizisi
nOkunacak maksimum karakter sayısı (n-1 kadar okunur, sonuna \0 eklenir)
streamVeri kaynağı (örneğin stdin veya fp)

🖥️ A. Standart Girdiden (stdin) Okuma


#include<stdio.h>

int main() {
char string[20];
printf("Metni girin: ");
fgets(string, 20, stdin); // Maksimum 19 karakter + '\0'
printf("\nOkunan metin: %s", string);
return 0;
}

📤 Örnek çıktı:


Metni girin: Merhaba Dünya
Okunan metin: Merhaba Dünya

📂 B. Dosyadan Okuma


#include<stdio.h>

int main() {
char string[20];
FILE *fp = fopen("veri.txt", "r"); // Dosyayı okuma modunda aç
fgets(string, 20, fp); // İlk 19 karakteri oku
printf("Dosyadan okunan: %s", string);
fclose(fp);
return 0;
}

💡 Eğer veri.txt dosyasında Rabisu Cloud fgets örneği! yazıyorsa, çıktı şu şekilde olur:


Dosyadan okunan: Rabisu Cloud fgets örneği!

⚖️ gets() ve fgets() Karşılaştırması

Özellikgets()fgets()
Boşluk OkumaEvetEvet
Tampon Boyutu SınırıHayırEvet (n parametresiyle)
GüvenlikDüşük (bellek taşması riski)Yüksek
Kaynak AkışıYalnızca stdinstdin veya dosya
DurumuC11'de kaldırıldıAktif
TavsiyeKullanmayınŞiddetle önerilir

❓ Sıkça Sorulan Sorular (SSS)

1️⃣ scanf() neden boşluklu metinleri okuyamaz?

Çünkü scanf() boşluk veya tab karakterine geldiğinde okumayı durdurur.

2️⃣ gets() neden kaldırıldı?

Kullanıcının girdi uzunluğu kontrol edilmediği için bellek taşması riski oluşturur.

3️⃣ fgets() girdiye \n karakteri ekliyor, nasıl temizlerim?

Şu satırı kullanarak silebilirsin:


string[strcspn(string, "\n")] = '\0';

4️⃣ fgets() ile dosya dışında da kullanılabilir mi?

Evet, hem stdin (klavye) hem de FILE * (dosya) kaynaklarından veri okuyabilir.

5️⃣ Hangisini kullanmalıyım?

Her zaman fgets() kullan. Güvenlidir, standarttır, modern C’nin önerdiği çözümdür.


🚀 Sonuç

C programlamada boşluklu metin girdilerini almak için scanf() yerine fgets() kullanmak en doğru yaklaşımdır. gets() geçmişte pratik olsa da, güvenlik açıkları nedeniyle terk edilmiştir. fgets() sayesinde hem tampon boyutunu belirleyebilir hem de bellek taşması riskini sıfırlayabilirsin.

💡 Kendi C projelerini Rabisu Bulut sanal sunucularında test ederek, gerçek zamanlı performans ölçümleri yapabilir ve güvenli uygulama geliştirme ortamı oluşturabilirsin.

Rabisu Bulut platformunda hemen deneyebilirsiniz.